﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//void qsort(void* base,  //指针：指向的是待排序的数组的第一个元素
//	size_t num,         //base指向的待排序数组的元素的个数
//	size_t size,        //base指向的待排序的数组的元素大小
//	int (*compar)(const void*, const void*));//函数指针：指向的就是两个元素的比较函数

//冒泡排序：由小到大排序
//void bubble_arr(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//			}
//		}
//	}
//}
//
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//int main()
//{
//	int arr[] = { 1,3,5,7,9,2,4,6,8,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_arr(arr, sz);
//	print(arr, sz);
//
//	return 0;
//}

////利用qsort进行排序
//int int_cmp(const void* p1,const void * p2)
//{
//	/*if (*(int*)p1 - *(int*)p2 > 0)
//		return p1;
//	else if (*(int*)p1 - *(int*)p2 == 0)
//		return 0;
//	else
//		return -1;*/
//
//	return *(int*)p1 - *(int*)p2;
//}
//
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//void test()
//{
//	int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(int), int_cmp);
//	print(arr,sz);
//}

//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//int struct_cmp_by_name(const void* p1, const void* p2)
//{
//	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p1)->name);
//}
//
//int struct_cmp_by_age(const void* p1, const void* p2)
//{
//	return ((struct Stu*)p1)->age, ((struct Stu*)p1)->age;
//}
//
//void test2()
//{
//	struct Stu arr[3] = { {"zhangsan",18},{"lisi",25},{"wangwu",27} };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//qsort(arr, sz, sizeof(arr[0]), struct_cmp_by_name);
//	qsort(arr, sz, sizeof(arr[0]), struct_cmp_by_age);
//
//
//}
//
////使⽤qsort排序结构数据
//int main()
//{
//	//test1();
//	test2();
//	return 0;
//}

//int_cmp(const void* p1, const void* p2)
//{
//	return (*(int*)p1 - *(int*)p2);
//	
//}
//
//void swap(char* p1, char* p2, int width)
//{
//	//遍历每一个元素并且进行比较
//	for (int i = 0; i < width; i++)
//	{
//		char* temp = *p1;
//		*p1 = *p2;
//		*p2 = temp;
//		p1++;
//		p2++;
//	}
//}
//
//void bubble_sort(void* base, int sz, int width, int (*cmp)(const void*p1,const void*p2))
//{
//	int i = 0;
//	//趟数
//	for (i = 0; i < sz - 1; i++)
//	{
//		int j = 0;
//		//每一次进行两两比较
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (strcmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
//			{
//				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//
////qsort函数的模拟实现
//int main()
//{
//	int arr[] = { 1,3,5,7,9,2,4,6,8,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz, sizeof(arr[0]), int_cmp);
//
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}
//

////数组名的理解
////数组名是数组首元素的地址
////
////sizeof(数组名) -- 数组名表示的是整个数组的大小，单位是字节
////&数组名  -- 表示的是整个数组，取出的是整个数组的地址
//int main()
//{
//	int a[] = { 1,2,3,4 };//数组有4个元素
//	printf("%zd\n", sizeof(a));//16  sizeof(数组名)的场景
//
//	printf("%zd\n", sizeof(a + 0));//a是首元素的地址--类型是int* ，a+0 还是首元素的地址，是地址就是4/8个字节
//
//	printf("%zd\n", sizeof(*a));//4  *a=a[0]=*(a+0)
//
//	printf("%zd\n", sizeof(a + 1));//4/8  类型是int*，a+1跳过一个整形，是第二个元素的地址，是地址就是4/8个字节
//
//	printf("%zd\n", sizeof(a[1]));//4   a[1]就是第二个元素2
//
//	printf("%zd\n", sizeof(&a));//4/8   &a是数组的地址，数组的地址也是地址，是地址就是4/8个字节
//
//	printf("%zd\n", sizeof(*&a));//16   *&互相抵消了  sizeof(*&a)==sizeof(a)
//	//
//	printf("%zd\n", sizeof(&a + 1));//4/8  &a+1是跳过整个数组后那个位置的地址，是地址就是4/8个字节
//
//	printf("%zd\n", sizeof(&a[0]));//4/8   &a[0]是首元素地址，是地址就是4/8个字节
//
//	printf("%zd\n", sizeof(&a[0] + 1));//4/8  &a[0] + 1是数组第二个元素的地址，是地址就是4/8个字节
//
//	return 0;
//
//}


int main()
{


	return 0;
}
